
let id = 0;

/*
    每个属性都有一个 dep 用来收集 watcher
*/

class Dep {
    constructor() {
        // 标识符
        this.id = id++;

        // 存储收集到的 watcher
        this.subs = [];
    }
    depend() {
        // 调用 watcher 的 addDep 方法记录 dep
        Dep.target.addDep(this);
    }
    addSub(watcher) {
        // 收集 wattcher
        this.subs.push(watcher);
    }
    notify() {
        this.subs.forEach(watcher => watcher.update());
    }
}

// 在全局上新增一个静态属性，用来挂载当前 watcher 到 dep 上
Dep.target = null;


// 维护一个存储当前 watcher 的栈
const stack = [];

// 存储当前的 watcher
export function pushTarget(watcher) {
    // 将当前的 watcher 放入栈中
    stack.push(watcher);
    // 将当前的 watcher 挂载到 Dep.target 上
    Dep.target = watcher;
}

// 弹出当前的 watcher
export function popTarget() {
    // 弹出当前栈顶的 watcher
    stack.pop();
    // 将 Dep.target 指向当前栈顶的 watcher
    Dep.target = stack.at(-1);
}

export default Dep;